package com.java.container;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * LinkedHashMap是一个特殊的Map对象。
 * 底层会基于双向链表记录Map中的key的添加或访问顺序
 */
public class LinkedHashMapTests {
    static void doTest01(){
        //1.使用无参构造构建LinkedHashMap对象时，存储对象默认会记录key的添加顺序
        LinkedHashMap<Object,Object> map1=new LinkedHashMap<>();
        map1.put("F", 100);
        map1.put("A", 200);
        map1.put("M", 300);
        map1.get("F");
        System.out.println(map1);
        //2.通过带参构造构建LinkedHashMap对象，并记录key的访问顺序
        LinkedHashMap<Object,Object> map2=
                new LinkedHashMap<>(3,0.75f,true);
        map2.put("F", 100);
        map2.put("A", 200);
        map2.put("M", 300);
        map2.get("F");
        map2.put("E", 400);
        System.out.println(map2);
    }
    static void doTest02(){
        //思考LinkedHashMap中LRU算法的一个应用
        LinkedHashMap<Object,Object> map=
                new LinkedHashMap(3,0.75f,true){
                    //每次执行put方法都会调用此方法，用于判断容器是否已经满了
                    //方法返回true表示已满，此时会先移除(最近访问最少)再放入。
                    @Override
                    protected boolean removeEldestEntry(Map.Entry eldest) {
                        return size()>3;//默认值是false(表示不移除，即便是满了)
                    }
        };
        map.put("F", 100);
        map.put("A", 200);
        map.put("M", 300);
        map.get("F");
        map.get("A");
        map.put("E", 400);
        System.out.println(map);
    }
    public static void main(String[] args) {
       //doTest01();
       doTest02();
    }
}
